Usually your subobjects should actually be 'contained' in the aggregate class (but not always; 'wrapper' objects are a good example of where you want a a ptr/ref; also the N-to-1-uses-a relationship needs something like a ptr/ref).
There are three reasons why fully contained subobjects have better performance than ptrs to freestore allocated subobjects:
* extra layer to indirection every time you need to access subobject
* extra freestore allocations ('new' in ctor, 'delete' in dtor)
* extra dynamic binding (reason given later in this question)